home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / ibus-table / engine / speedmeter.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  13KB  |  341 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import pygtk
  5. pygtk.require('2.0')
  6. import gtk
  7. import gtk.gdk as gdk
  8. import dbus
  9. import dbus.service as dbus
  10. import dbus.mainloop.glib as dbus
  11. import time
  12. import threading
  13. import os.path as path
  14. import os
  15. import sys
  16. import optparse
  17. import subprocess as sb
  18. opt = optparse.OptionParser()
  19. opt.add_option('--daemon', '-d', action = 'store_true', dest = 'daemon', default = False, help = 'Run as daemon, default: %default')
  20. (options, args) = opt.parse_args()
  21.  
  22. def daemonize(stdout = '/dev/null', stderr = None, stdin = '/dev/null', pidfile = None):
  23.     '''
  24.     This forks the current process into a daemon.
  25.     The stdin, stdout, and stderr arguments are file names that
  26.     will be opened and be used to replace the standard file descriptors
  27.     in sys.stdin, sys.stdout, and sys.stderr.
  28.     These arguments are optional and default to /dev/null.
  29.     Note that stderr is opened unbuffered, so
  30.     if it shares a file with stdout then interleaved output
  31.     may not appear in the order that you expect.
  32.     '''
  33.     
  34.     try:
  35.         pid = os.fork()
  36.         if pid > 0:
  37.             sys.exit(0)
  38.     except OSError:
  39.         e = None
  40.         sys.stderr.write('fork #1 failed: (%d) %s\n' % (e.errno, e.strerror))
  41.         sys.exit(1)
  42.  
  43.     os.chdir('/')
  44.     os.umask(0)
  45.     os.setsid()
  46.     
  47.     try:
  48.         pid = os.fork()
  49.         if pid > 0:
  50.             sys.exit(0)
  51.     except OSError:
  52.         e = None
  53.         print 'second fork error'
  54.         sys.stderr.write('fork #2 failed: (%d) %s\n' % (e.errno, e.strerror))
  55.         sys.exit(1)
  56.  
  57.     if not stderr:
  58.         stderr = stdout
  59.     
  60.     si = file(stdin, 'r')
  61.     so = file(stdout, 'w+')
  62.     se = file(stderr, 'a+', 0)
  63.     pid = str(os.getpid())
  64.     print 'Start SpeedMeter with Pid: %s\n' % pid
  65.     sys.stderr.flush()
  66.     if pidfile:
  67.         file(pidfile, 'w+').write('%s\n' % pid)
  68.     
  69.     sys.stdout.flush()
  70.     sys.stderr.flush()
  71.     os.dup2(si.fileno(), sys.stdin.fileno())
  72.     os.dup2(so.fileno(), sys.stdout.fileno())
  73.     os.dup2(se.fileno(), sys.stderr.fileno())
  74.  
  75.  
  76. class Timer(threading.Thread):
  77.     '''add 0 to clist every second, clist must be a list of int'''
  78.     
  79.     def __init__(self, accumulate):
  80.         super(Timer, self).__init__()
  81.         self.on = True
  82.         self.tlock = threading.RLock()
  83.         self.func = accumulate
  84.         self.sum = 0
  85.  
  86.     
  87.     def run(self):
  88.         while self.on:
  89.             if self.sum == 0:
  90.                 self.func(0)
  91.             
  92.             self.sum = (self.sum + 1) % 5
  93.             time.sleep(0.2)
  94.  
  95.     
  96.     def join(self):
  97.         self.on = False
  98.         super(Timer, self).join()
  99.  
  100.  
  101.  
  102. class Handle(gtk.EventBox):
  103.     
  104.     def __init__(self):
  105.         super(Handle, self).__init__()
  106.         self.set_events(gdk.BUTTON_PRESS_MASK | gdk.BUTTON_RELEASE_MASK | gdk.BUTTON1_MOTION_MASK)
  107.         self.connect('button_press_event', self.do_button_press_event)
  108.         self.connect('button_release_event', self.do_button_release_event)
  109.         self.connect('motion_notify_event', self.do_motion_notify_event)
  110.         self._Handle__move_begined = False
  111.  
  112.     
  113.     def do_button_press_event(self, widget, event, data = None):
  114.         if event.button == 1:
  115.             root = gdk.get_default_root_window()
  116.             
  117.             try:
  118.                 desktop = root.property_get('_NET_CURRENT_DESKTOP')[2][0]
  119.                 self._Handle__workarea = root.property_get('_NET_WORKAREA')[2][desktop * 4:(desktop + 1) * 4]
  120.             except:
  121.                 self._Handle__workarea = None
  122.  
  123.             self._Handle__move_begined = True
  124.             toplevel = self.get_toplevel()
  125.             (x, y) = toplevel.get_position()
  126.             self._Handle__press_pos = (event.x_root - x, event.y_root - y)
  127.             self.window.set_cursor(gdk.Cursor(gdk.FLEUR))
  128.             return True
  129.         return False
  130.  
  131.     
  132.     def do_button_release_event(self, widget, event, data = None):
  133.         if event.button == 1:
  134.             self._Handle__move_begined = False
  135.             del self._Handle__press_pos
  136.             del self._Handle__workarea
  137.             self.window.set_cursor(gdk.Cursor(gdk.HAND1))
  138.             return True
  139.         return False
  140.  
  141.     
  142.     def do_motion_notify_event(self, widget, event, data = None):
  143.         if not self._Handle__move_begined:
  144.             return None
  145.         toplevel = self.get_toplevel()
  146.         (x, y) = toplevel.get_position()
  147.         x = int(event.x_root - self._Handle__press_pos[0])
  148.         y = int(event.y_root - self._Handle__press_pos[1])
  149.         if self._Handle__workarea == None:
  150.             toplevel.move(x, y)
  151.             return None
  152.         if y < self._Handle__workarea[1] and y > self._Handle__workarea[1] - 16:
  153.             y = self._Handle__workarea[1]
  154.         
  155.         (w, h) = toplevel.get_size()
  156.         if x + w > self._Handle__workarea[0] + self._Handle__workarea[2] and x + w < self._Handle__workarea[0] + self._Handle__workarea[2] + 16:
  157.             x = self._Handle__workarea[0] + self._Handle__workarea[2] - w
  158.         
  159.         if y + h > self._Handle__workarea[1] + self._Handle__workarea[3] and y + h < self._Handle__workarea[1] + self._Handle__workarea[3] + 16:
  160.             y = self._Handle__workarea[1] + self._Handle__workarea[3] - h
  161.         
  162.         toplevel.move(x, y)
  163.  
  164.  
  165. SPEED_METER_PATH = '/org/ibus/table/SpeedMeter'
  166.  
  167. class SpeedMeter(dbus.service.Object):
  168.     '''Show the typing speed of user'''
  169.     
  170.     method = lambda **args: dbus.service.method(dbus_interface = 'org.ibus.table.SpeedMeter', **args)
  171.     
  172.     signal = lambda **args: dbus.service.signal(dbus_interface = 'org.ibus.table.SpeedMeter', **args)
  173.     
  174.     def __init__(self, conn):
  175.         self._SpeedMeter__conn = conn
  176.         self._SpeedMeter__path = SPEED_METER_PATH
  177.         super(SpeedMeter, self).__init__(self._SpeedMeter__conn, self._SpeedMeter__path)
  178.         self.list = [
  179.             (0, time.time(), 0)]
  180.         self.create_ui()
  181.         self.full = False
  182.         self.c_time = 0
  183.         self.timer = Timer(self.update_speed)
  184.         gdk.threads_enter()
  185.         self.timer.start()
  186.         gdk.threads_leave()
  187.         self.run()
  188.  
  189.     
  190.     def Accumulate(self, phrase_len):
  191.         self.update_speed(phrase_len)
  192.  
  193.     Accumulate = method(in_signature = 'i')(Accumulate)
  194.     
  195.     def Reset(self):
  196.         self.reset()
  197.  
  198.     Reset = method()(Reset)
  199.     
  200.     def Quit(self):
  201.         self.quit()
  202.  
  203.     Quit = method()(Quit)
  204.     
  205.     def Show(self):
  206.         self.window.move(*self.pos)
  207.         self.window.show()
  208.  
  209.     Show = method()(Show)
  210.     
  211.     def Hide(self):
  212.         self.pos = self.window.get_position()
  213.         self.window.hide()
  214.  
  215.     Hide = method()(Hide)
  216.     
  217.     def quit(self):
  218.         gtk.main_quit()
  219.         gdk.threads_leave()
  220.         self.timer.join()
  221.  
  222.     
  223.     def quit_from_timer(self):
  224.         gtk.main_quit()
  225.         gdk.threads_leave()
  226.  
  227.     
  228.     def create_ui(self):
  229.         self.window = gtk.Window(gtk.WINDOW_POPUP)
  230.         root = gdk.get_default_root_window()
  231.         
  232.         try:
  233.             workarea = root.property_get('_NET_WORKAREA')[2]
  234.             right = workarea[2]
  235.             bottom = workarea[3]
  236.         except:
  237.             (right, bottom) = root.get_size()
  238.  
  239.         self.pos = (right - 100, bottom - 90)
  240.         self.window.move(*self.pos)
  241.         self.event_box = Handle()
  242.         self.event_box.connect('button_press_event', self.do_button_press_event)
  243.         self.event_box.show()
  244.         self.window.add(self.event_box)
  245.         self.event_box.realize()
  246.         self.event_box.window.set_cursor(gdk.Cursor(gdk.HAND1))
  247.         self.frame = gtk.Frame()
  248.         self.frame.show()
  249.         self.event_box.add(self.frame)
  250.         self.vbox = gtk.VBox()
  251.         self.vbox.show()
  252.         self.frame.add(self.vbox)
  253.         self.frame1 = gtk.Frame()
  254.         self.frame1.show()
  255.         self.vbox.pack_start(self.frame1)
  256.         self.label_color = gdk.Color(0, 0, 65535)
  257.         self.speed_label = gtk.Label()
  258.         self.speed_label.set_text('0')
  259.         self.speed_label.set_size_request(81, 47)
  260.         self.speed_label.set_justify(gtk.JUSTIFY_CENTER)
  261.         self.speed_label.modify_fg(gtk.STATE_NORMAL, self.label_color)
  262.         self.speed_label.show()
  263.         self.vbox.pack_start(self.speed_label)
  264.  
  265.     
  266.     def run(self):
  267.         gdk.threads_enter()
  268.         gtk.main()
  269.  
  270.     
  271.     def update_speed(self, phrase_len):
  272.         '''Update the output of SpeedMeter'''
  273.         now = time.time()
  274.         self.timer.tlock.acquire()
  275.         self.list.append((phrase_len, now))
  276.         self.list = (map,)((lambda x: (x[0], x[1], now - x[1])), self.list)
  277.         self.list = filter((lambda x: x[2] < 61), self.list)
  278.         self.timer.tlock.release()
  279.         if not self.full:
  280.             self.c_time = self.list[-1][1] - self.list[0][1]
  281.             if not self.c_time > 1 or self.c_time:
  282.                 pass
  283.             self.c_time = 1
  284.             self.full = self.c_time >= 60
  285.         
  286.         speed = sum(map((lambda x: x[0]), self.list)) * 60 / self.c_time
  287.         speed = int(speed)
  288.         if speed > 10:
  289.             if speed < 112:
  290.                 if speed >= 61:
  291.                     color = (112 - speed) * 5
  292.                     self.label_color.red = 65535
  293.                     self.label_color.blue = (color << 8) + color
  294.                 else:
  295.                     color = (speed - 10) * 5
  296.                     self.label_color.red = (color << 8) + color
  297.                     self.label_color.blue = 65535
  298.             else:
  299.                 self.label_color.red = 65535
  300.                 self.label_color.blue = 0
  301.         else:
  302.             self.label_color.red = 0
  303.             self.label_color.blue = 65535
  304.         self.speed_label.set_text('%d' % speed)
  305.         self.speed_label.modify_fg(gtk.STATE_NORMAL, self.label_color)
  306.  
  307.     
  308.     def reset(self):
  309.         self.timer.tlock.acquire()
  310.         self.list = [
  311.             (0, time.time(), 0)]
  312.         self.full = False
  313.         self.c_time = 0
  314.         self.timer.tlock.release()
  315.         self.update_speed(0)
  316.  
  317.     
  318.     def do_button_press_event(self, widget, event, data = None):
  319.         if event.button == 3:
  320.             self.reset()
  321.             return True
  322.         return False
  323.  
  324.  
  325. if __name__ == '__main__':
  326.     dbus.mainloop.glib.DBusGMainLoop(set_as_default = True)
  327.     bus = dbus.Bus()
  328.     user = path.basename(path.expanduser('~'))
  329.     name = 'org.ibus.table.SpeedMeter.%s' % user
  330.     request = bus.request_name(name, dbus.bus.NAME_FLAG_DO_NOT_QUEUE)
  331.     if request != dbus.bus.REQUEST_NAME_REPLY_PRIMARY_OWNER:
  332.         sys.exit()
  333.     
  334.     if options.daemon:
  335.         daemonize('/dev/null', None, '/dev/null')
  336.     
  337.     busname = dbus.service.BusName(name, bus)
  338.     gdk.threads_init()
  339.     SpeedMeter(bus)
  340.  
  341.